package com.lagou.module4hw.hw3;

import java.io.*;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * 复制目录的所有内容类
 */
public class CopyFileRunnableImpl implements Runnable {

    /**
     * HashMap<String,String> dir 目录信息
     * key -- src目录
     * value -- dest目录
     */
    private HashMap<String,String> dir;

    //是否为根目录
    private boolean isRoot;

    public CopyFileRunnableImpl(HashMap<String,String> dir, boolean isRoot) {
        this.dir = dir;
        this.isRoot = isRoot;
    }

    @Override
    public void run() {
        copyFile();
    }

    /**
     * 拷贝目录信息
     */
    private void copyFile() {
        //1.判断目录是否存在,不存在就创建
        Set<Map.Entry<String, String>> entries = dir.entrySet();
        for(Map.Entry<String, String> entry : entries){
            String src = entry.getKey();
            String dest = entry.getValue();
            //System.out.println(src + " --> "+ dest);
            //2.当前线程处理的是否有根目录
            if( isRoot ){
                //当前线程处理的是根目录，只要复制根目录的文件信息就可以
                copyFile0(src,dest,true);
            }else{
                //当前线程处理的是子目录，必须复制子目录的所有信息
                copyFile0(src,dest,false);
            }
        }
    }

    /**
     * 把源目录的内容复制到目录目录
     * @param src 源目录
     * @param dest 目标目录
     * @param flag 是否只复制文件 true -- 只复制文件  false -- 复制所有
     */
    private void copyFile0(String src, String dest , boolean flag) {
        File file = new File(src);
        if( !file.exists() ){    //源目录不存在
            return ;
        }

        File file2 = new File(dest);
        if( !file2.exists()){   //目标目录不存在,创建dest目录
            file2.mkdir();
        }

        //2.获取src下的所有文件信息
        File[] files = file.listFiles();
        for( File f : files){
            String srcFile = f.toString();
            String destFile = dest + "\\" + f.getName();
            if( flag && f.isFile() ){
                //copy文件
                copyFile1(srcFile,destFile);
            }else{
                //copy所有
                if( f.isFile() ){
                    copyFile1(srcFile,destFile);
                }else {
                    copyFile0(srcFile, destFile, false);
                }
            }
        }
    }

    /**
     * 复制文件
     * @param srcFile
     * @param destFile
     */
    private void copyFile1(String srcFile, String destFile) {
        System.out.println(" 开始复制： " + srcFile + " --> " + destFile);
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        try {
            // 1.创建文件输入流
            bis = new BufferedInputStream(new FileInputStream(srcFile));
            // 2.创建文件输出流
            bos = new BufferedOutputStream(new FileOutputStream(destFile));

            // 3.不断地从输入流中读取数据并写入到输出流中
            byte[] bArr = new byte[1024];
            int res = 0;
            while ((res = bis.read(bArr)) != -1) {
                bos.write(bArr, 0, res);
            }
            //System.out.println("拷贝文件成功！");
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            // 4.关闭流对象并释放有关的资源
            if (null != bos) {
                try {
                    bos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (null != bis) {
                try {
                    bis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
